//package com.kaili.config;
//
//import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
//import com.baomidou.mybatisplus.toolkit.CollectionUtils;
//import com.kaili.common.ResponseBean;
//import com.kaili.common.exception.IResponseStatus;
//import com.kaili.common.util.CommonUtil;
//import com.kaili.except.ResponseStatus;
//import com.kaili.utils.Annotation.CheckFieldTools;
//import org.springframework.context.MessageSource;
//import org.springframework.http.HttpInputMessage;
//import org.springframework.http.HttpOutputMessage;
//import org.springframework.http.converter.HttpMessageNotReadableException;
//import org.springframework.http.converter.HttpMessageNotWritableException;
//import springfox.documentation.spring.web.json.Json;
//import springfox.documentation.swagger.web.SecurityConfiguration;
//import springfox.documentation.swagger.web.SwaggerResource;
//import springfox.documentation.swagger.web.UiConfiguration;
//
//import java.io.IOException;
//import java.lang.reflect.Type;
//import java.util.ArrayList;
//
//public class KLFastJosnHttpMessageConverter extends FastJsonHttpMessageConverter{
//
//    private MessageSource messageSource;
//
//    public KLFastJosnHttpMessageConverter(MessageSource messageSource){
//        this.messageSource = messageSource;
//    }
//
//    /**
//     * 兼容SWAGGER 接口
//     * @param obj
//     * @param outputMessage
//     * @throws IOException
//     * @throws HttpMessageNotWritableException
//     */
//    @Override
//    protected void writeInternal(Object obj, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
//        Object ret = null ;
//        if(obj instanceof ResponseBean){
//            ret = obj;
//        } else if (obj instanceof IResponseStatus) {
//            ret = new ResponseBean();
//            ((ResponseBean) ret).setStatus(((IResponseStatus) obj).getCode());
//            ((ResponseBean) ret).setMessage(CommonUtil.getMessage(messageSource,((IResponseStatus) obj).getMsg()));
//            ((ResponseBean) ret).setData("");
//        }else if(obj instanceof Json){
//            ret = obj;
//        }else if(obj instanceof UiConfiguration){
//            ret = obj;
//        }else if(obj instanceof SecurityConfiguration){
//            ret = obj;
//        }else if(obj instanceof ArrayList){
//            ArrayList<Object> item = (ArrayList<Object>) obj;
//            if(CollectionUtils.isNotEmpty(item)){
//                if(item.get(0) instanceof SwaggerResource){
//                    ret = obj;
//                }else{
//                    ret = new ResponseBean();
//                    ((ResponseBean) ret).setStatus(200);
//                    ((ResponseBean) ret).setMessage("OK");
//                    ((ResponseBean)ret).setData(obj);
//                }
//            }else{
//                ret = new ResponseBean();
//                ((ResponseBean) ret).setStatus(ResponseStatus.RESPONSE_OK.getCode());
//                ((ResponseBean) ret).setMessage(ResponseStatus.RESPONSE_OK.getMsg());
//                ((ResponseBean)ret).setData(new ArrayList<>());
//            }
//        }else {
//            ret = new ResponseBean();
//            ((ResponseBean) ret).setStatus(200);
//            ((ResponseBean) ret).setMessage("OK");
//            ((ResponseBean)ret).setData(obj);
//        }
//        super.writeInternal(ret,outputMessage);
//    }
//
//    @Override
//    public Object read(Type type, Class<?> contextClass, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
//
//        Object obj = super.read(type, contextClass, inputMessage);
//        boolean ok = false;
//        try {
//            ok = CheckFieldTools.checkField(obj);
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            if (!ok) {
//                throw new HttpMessageNotReadableException(ResponseStatus.DATA_STRUCT_ERR.getMsg());
//            }
//        }
//        return obj;
//    }
//}
